package com.hhq.demo.service.impl;

import com.hhq.demo.bean.Express;
import com.hhq.demo.bean.RankingBean;
import com.hhq.demo.dao.ExpressDao;
import com.hhq.demo.dao.impl.ExpressDaoImpl;
import com.hhq.demo.exception.DuplicateCodeException;
import com.hhq.demo.service.ExpressService;
import com.hhq.demo.utils.RandomUtil;

import java.util.List;
import java.util.Map;

/**
 * @author HHQ
 * @date 2021年12月12日
 */
public class ExpressServiceImpl implements ExpressService {

    ExpressDao expressDao = new ExpressDaoImpl();

    /**
     * 获取控制台数据
     *
     * @return 快递总数，新增快递数，待取件数，新增代取件数
     */
    @Override
    public Map<String, Object> consoleData() {
        return expressDao.consoleData();
    }

    /**
     * 查询所有快递信息
     *
     * @return 快递集合
     */
    @Override
    public List<Express> listAll() {
        return expressDao.listAll();
    }

    /**
     * 分页查询快递信息
     *
     * @param offset     起始索引
     * @param pageNumber 每页显示数量
     * @return 快递集合
     */
    @Override
    public List<Express> listLimit(Integer offset, Integer pageNumber) {
        return expressDao.listLimit(offset,pageNumber);
    }

    /**
     * 根据快递单号删除
     *
     * @param number 单号
     * @return 受影响的行数
     */
    @Override
    public int deleteByNumber(String number) {
        return expressDao.deleteByNumber(number);
    }

    /**
     * 新增快递
     *
     * @param express 快递
     * @return 受影响的行数
     */
    @Override
    public int insert(Express express) {
        int insert = 0;
        express.setCode(RandomUtil.getCode());
        try {
            insert = expressDao.insert(express);
            if (insert==1) {
                //录入成功，给用户发送短信
                System.out.println(express.getReceivePhone()+"的取件码为"+express.getCode());
            }
            return insert;
        } catch (DuplicateCodeException e){
            return insert(express);
        }
    }
    /**
     * 根据单号查询快递信息
     *
     * @param number 单号
     * @return 快递信息
     */
    @Override
    public Express findByNumber(String number) {
        return expressDao.findByNumber(number);
    }

    /**
     * 修改快递信息
     *
     * @param id      要修改的快递的id
     * @param express 要修改的快递的信息
     * @return 受影响的行数
     */
    @Override
    public int update(Integer id, Express express) {
        int flag = 0;
        //如果手机号码为null，则说明没有修改手机号码
        if (express.getReceivePhone()==null) {
            flag = expressDao.update(id, express);
        } else {
            //如果修改了手机号码，就需要重新生成取件码，所以可以直接删除之前的数据再重新插入全新的数据
            int deleteI = deleteByNumber(express.getNumber());
            int insertI = insert(express);
            if (deleteI==1&&insertI==1) {
                flag=1;
            }
        }
        return flag;
    }

    /**
     * 根据取件码删除快递
     *
     * @param code 取件码
     * @return 受影响的行数
     */
    @Override
    public int deleteByCode(String code) {
        return expressDao.deleteByCode(code);
    }

    /**
     * 根据手机号码查找快递
     *
     * @param phone 手机号码
     * @return 快递集合
     */
    @Override
    public List<Express> findByPhone(String phone) {
        return expressDao.findByPhone(phone);
    }

    /**
     * 根据取件码改变快递的状态
     *
     * @param code 取件码
     * @return 受影响的行数
     */
    @Override
    public int updateStatus(String code) {
        return expressDao.updateStatus(code);
    }

    /**
     * 根据取件码查询快递
     *
     * @param code 取件码
     * @return 快递信息
     */
    @Override
    public Express findByCode(String code) {
        return expressDao.findByCode(code);
    }

    /**
     * 总排名
     *
     * @return 排名结果
     */
    @Override
    public List<RankingBean> rankExpressNumber() {
        return expressDao.rankExpressNumber();
    }

    /**
     * 年排名
     *
     * @return 排名结果
     */
    @Override
    public List<RankingBean> rankExpressNumberToYear() {
        return expressDao.rankExpressNumberToYear();
    }

    /**
     * 月排名
     *
     * @return 排名结果
     */
    @Override
    public List<RankingBean> rankExpressNumberToMonth() {
        return expressDao.rankExpressNumberToMonth();
    }
}
